#多继承、多态

#一、父类私有属性
'''
不对外公开的，外界以及子类都不能直接方位
私有属性、方法通常用于做一些内部的事情


'''
#1.子类对象不能在自己的方法内部，直接访问父类的私有属性或私有方法
class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200  #__num2 私有属性

    def __test(self):      #私有方法
        print(f'私有方法{self.unm1}，{self.__num2}')

class B(A):       #B类继承A类
    def demo(self):
        print('哈哈哈')
        #1.在子类的对象方法中，不能访问父类的私有属性
        #print('访问父类的私有属性%d'% sefl.__num2) #Error
        #2在子类的对象方法中，不能调用父类的私有方法
        #self.__test()  #Error

#创建一个子类对象
b = B()
b.demo()    #调用demo()方法   说明子类不能继承父类的私有方法
#print(b.__num2)   #Error，说明子类不能继承父类私有属性
print('\n')



#2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法
class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200  #__num2 私有属性

    def __test(self):      #私有方法
        print(f'私有方法{self.num1}，{self.__num2}')

    def test(self):    #定义一个公有方法，来使用私有属性和方法
        print('父类的公有方法%d'% self.__num2)
        self.__test()

class B(A):       #B类继承A类
    def demo(self):
        print(123)
        print('子类方法%d'%self.num1)
        self.test()    #在子类中调用

b = B()
#在外界访问父类的公有属性、或调用公有方法
print(b.num1)
b.test()
b.demo()
print('\n')


#二、多继承
'''
所谓多继承就是一个类同时继承了多个父类，并且具有所有父类的属性和方法。

'''
class A1:
    def test(self):
        print('这是test方法')

class B1:
    def demo(self):
        print('这是demo方法')

class C1(A1,B1):     #C1继承父类A1和B1
    pass
#创建子类对象
c = C1()
c.test()
c.demo()
print('\n')

#如果不同的父类中存在同名方法，子类对象在调用方法时，会调用哪一个类中的方法呢？
'''
执行顺序就近原则，先继承哪个父类，就先调用该父类中的方法。

#查看子类调用方法的顺序语句，假设子类名是C
语句格式：C.__mro__
比如：print(C.__mro__)
'''
class A2:
    def play(self):
        print('这是儿子')

class B2:
    def play(self):
        print('这是女儿')

class C2(B2,A2):      #谁先继承就先调用谁（先继承类B2）
    def play(self):
        A2.play(self) #对父类的扩展一 调用A2类的play()方法
        super().play()#对父类的扩展二
        print('就是这样')
#为C2创建对象c
c = C2()
c.play()   #c对象优先调用C2中的play()方法
print(C2.__mro__) #<class '__main__.C2'>, <class '__main__.B2'>, <class '__main__.A2'>, <class 'object'>
print('\n')


